#include <iostream>
#include <vector>

using namespace std;


class Queue
{
private:
    int* data = new int[10](); // 动态申请10个int数据空间，并将该数组初始化为0
    int* start_ptr = data;   // 起始状态，起始指针指向data第一块内存
    int* end_ptr = data;     // 起始状态，结束指针和起始指针指向同一块内存
    int* max_addr = data + 10;
public:
    Queue(/* args */);
    ~Queue();

    int push(int value);
    int pop(void);

    void print(void);

    bool is_empty();
    bool is_full();
    
};

Queue::Queue(/* args */)

{
}

Queue::~Queue()
{
    cout << "析构函数被调用" << endl;
    delete[] data;
}

int Queue::pop(void)
{
    // 先进先出，永远从队列的最开始弹出
    if(is_empty())
    {
        cout << "队列为空！" << endl;
        return -1;
    }
    int tmp = *start_ptr;
    for (int *p=start_ptr; p < end_ptr; p++)
    {
        *p = *(p + 1);   // 弹出之后，所有元素前移一位
    }
    end_ptr --;  // 结束指针前移一位；
    return tmp;  //

}

int Queue::push(int value)
{
    // 如果压入成功，并且队列中有空余空间，则返回0
    // 如果队列已满，则弹出首个元素，然后将新元素存入队列尾端，并返回弹出值
    if (is_full())
    {
        int pop_value = pop();
        cout << "队列已满，弹出首位: " << pop_value << endl;
        *end_ptr = value;
        end_ptr ++;
        return pop_value;
    }
    else
    {
        *end_ptr = value;
        end_ptr ++;
        return 0;
    }

}

void Queue::print(void)
{
    cout << "data: " << endl; 
    for (int *p=start_ptr; p < end_ptr; p++) 
    {
        cout << *p << ", ";
    }
    cout << "\n";

    // cout << "all" << endl;
    // int* tp = start_ptr;
    // for (int i = 0; i < 10; i ++)
    // {
    //     cout << *tp << ", ";
    //     tp ++;
    // }
    // cout << "\n";

}

bool Queue::is_full()
{
    if (end_ptr >= max_addr)
        return true;
    else
        return false;
}

bool Queue::is_empty()
{
    if (start_ptr == end_ptr)
        return true;
    else
        return false;
}



int main()
{
    // cout << "queue" << endl;

    Queue q;
    for (int i=1; i < 11; i ++)
    {
        q.push(i);
        q.print();
    }
    q.push(15);
    q.print();

    for (int i=1; i < 13; i ++)
    {
        q.pop();
        q.print();
    }
}
